package com.lh.controller;

import com.lh.model.User;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * Redis测试类
 *
 * 注解：
 * 1.@RestController：相当于@ResponseBody+@Controller一起使用的效果；@RestController的小括号当中填写的内容，
 * 相当于@Service("")当中填写的内容，即spring bean的名称
 *
 * @Author LuoHang
 * @Date 2022-05-11 17:35
 **/
@RestController
public class RedisController {
    /*
       注入RedisTemplate（泛型）
       RedisTemplate<String,String>
       RedisTemplate<Object,Object>
       RedisTemplate
       注意：RedisTemplate对象的名称就是redisTemplate(因为SpringBoot在创建RedisTemplate对象时的id名就是redisTemplate对象)
    */
    /**
     * 默认使用jdk序列化
     * 这里能使用@Resource主要是因为Spring帮我们注册代理类时名称就是redisTemplate
     */
    @Resource
    private RedisTemplate<Object,Object> redisTemplate;

    /**
     * 默认使用字符串序列化
     * 这里能使用@Resource主要是因为Spring帮我们注册代理类时名称就是stringRedisTemplate
     */
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 往redis数据库中添加数据
     * @param name key
     * @param value value
     * @return 信息
     */
    @PostMapping("/redis/addString")
    public String addToRedis(String name,String value){
        ValueOperations<Object, Object> valueOperations = redisTemplate.opsForValue();
        valueOperations.set(name,value);
        return "向redis添加String类型数据:" + name + "-" + value;
    }

    /**
     * 通过key获取redis中的String类型的数据
     * 请求http://localhost:8081/redis/redis/getString?name=admin
     * @param name key
     * @return 信息
     */
    @GetMapping("/redis/getString")
    public String getData(String name){
        ValueOperations<Object, Object> valueOperations = redisTemplate.opsForValue();
        String value = (String) valueOperations.get(name);
        return "成功从redis获取数据:" + name + "-" + value;
    }

    /**
     * Restful风格的请求，往redis中存储key-value String类型数据
     * @param key key
     * @param value value
     * @return 信息
     */
    @PostMapping("/redis/{k}/{v}")
    public String addStringKv(@PathVariable(value = "k") String key,
                              @PathVariable(value = "v") String value){
        ValueOperations<Object, Object> valueOperations = redisTemplate.opsForValue();
        valueOperations.set(key,value);
        return "成功添加redis：" + key + "-" + value;
    }

    /**
     * Restful风格的请求，通过key获取redis中存储的值
     * 请求网址http://localhost:8081/redis/redis/admin
     * @param key 获取value的key值
     * @return 信息
     */
    @GetMapping("/redis/{key}")
    public String getStringKv(@PathVariable String key){
        ValueOperations<Object, Object> valueOperations = redisTemplate.opsForValue();
        String value = (String) valueOperations.get(key);
        return key + "-" + value;
    }

    /*
      设置RedisTemplate序列化
      可以单独设置key的序列化，也可以单独设置value的序列化
      可以同时设置key-value的序列化
     */

    /**
     * 添加序列化字符串到redis数据库中
     * @param k key
     * @param v vale
     * @return msg
     */
    @PostMapping("/redis/addStringXLH")
    public String addStringX(String k,String v){
        //使用RedisTemplate
        //设置key使用String的序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置value 的序列化
        redisTemplate.setValueSerializer(new StringRedisSerializer());

        ValueOperations<Object, Object> valueOperations = redisTemplate.opsForValue();
        valueOperations.set(k,v);
        return "实现字符串序列化：" + k + "-" + v;
    }

    /*
     使用json序列化，把Java对象转为json存储
     */

    /**
     * 将对象转为json存储，实体类----》json字符串
     * @return msg
     */
    @PostMapping("/redis/addJson")
    public String addJson(){
        User user = new User(1,"张三","123");
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //把值作为json序列化
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(User.class));

        redisTemplate.opsForValue().set("user001",user);

        return "json序列化";
    }

    /**
     * 反序列化获取redis中存储的json数据---》实体类对象
     * @return msg
     */
    @GetMapping("/redis/getJson")
    public String getJson(){
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(User.class));
        User user = (User) redisTemplate.opsForValue().get("user001");
        return "反序列化：" + user;
    }
}
